home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1994-07-26 | 2.9 KB | 104 lines | [.Ob./.Ob4] |
- Syntax10.Scn.Fnt
- StampElems
- Alloc
- 26 Jul 94
- MODULE Reals;
- (* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for MIPS R2000*) (* MB 9.12.91*)
- (* mah
- PowerMac *)
- IMPORT
- SYSTEM, MathL;
- TYPE
- CharPtr = POINTER TO ARRAY 64 OF CHAR;
- PROCEDURE Ten*(e: INTEGER): REAL;
- VAR r, power: LONGREAL;
- BEGIN r := 1.0;
- power := 10.0;
- WHILE e > 0 DO
- IF ODD(e) THEN r := r * power END;
- power := power * power; e := e DIV 2
- END ;
- RETURN SHORT(r)
- END Ten;
- PROCEDURE TenL*(e: INTEGER): LONGREAL;
- VAR r, power: LONGREAL;
- BEGIN r := 1.0;
- power := 10.0;
- LOOP
- IF ODD(e) THEN r := r * power END ;
- e := e DIV 2;
- IF e <= 0 THEN RETURN r END ;
- power := power * power
- END
- END TenL;
- PROCEDURE Expo*(x: REAL): INTEGER;
- BEGIN
- RETURN SHORT(ASH(SYSTEM.VAL(LONGINT, x), -23) MOD 256)
- END Expo;
- PROCEDURE ExpoL*(x: LONGREAL): INTEGER;
- VAR h: LONGINT;
- BEGIN
- SYSTEM.GET(SYSTEM.ADR(x), h);
- RETURN SHORT(ASH(h, -20) MOD 2048)
- END ExpoL;
- PROCEDURE SetExpo*(e: INTEGER; VAR x: REAL);
- CONST expo = {1..8};
- BEGIN
- x := SYSTEM.VAL(REAL, SYSTEM.VAL(SET, x) - expo + SYSTEM.VAL(SET, ASH(LONG(e), 23)))
- END SetExpo;
- PROCEDURE SetExpoL*(e: INTEGER; VAR x: LONGREAL);
- CONST expo = {1..11};
- VAR h: SET;
- BEGIN
- SYSTEM.GET(SYSTEM.ADR(x), h);
- h := h - expo + SYSTEM.VAL(SET, ASH(LONG(e), 20));
- SYSTEM.PUT(SYSTEM.ADR(x), h)
- END SetExpoL;
- PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR);
- VAR i, k: LONGINT;
- BEGIN
- i := ENTIER(x); k := 0;
- WHILE k < n DO
- d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k)
- END
- END Convert;
- PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
- VAR i: LONGINT; buf: MathL.String;
- BEGIN
- (*x := x - 0.5; already rounded in ecvt*)
- buf := SYSTEM.VAL(MathL.String, MathL.ecvt(x, n+7));
- n:=0; WHILE buf[n]#CHR(0) DO INC(n) END ;
- i:=4; WHILE i#n DO d[i-4] := buf[n-i-1]; INC(i) END ;
- IF d[i-5]='-' THEN DEC(i) END;
- d[i-6]:=d[i-5];
- d[i-5]:=CHR(0);
- END ConvertL;
- (* PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR);
- VAR decpt, sign, i: LONGINT; buf: CharPtr;
- BEGIN
- (*x := x - 0.5; already rounded in ecvt*)
- buf := SYSTEM.VAL(CharPtr, MathL.ecvt(x, n-7));
- i := 0;
- WHILE i < decpt DO d[n - i -1] := buf[i]; INC(i) END ;
- i := n - i - 1;
- WHILE i >= 0 DO d[i] := "0"; DEC(i) END ;
- END ConvertL; *)
- PROCEDURE Unpack(VAR b, d: ARRAY OF SYSTEM.BYTE);
- VAR i, k: SHORTINT; len: LONGINT;
- BEGIN i := 0; len := LEN(b);
- WHILE i < len DO
- k := SHORT(ORD(SYSTEM.VAL(CHAR, b[i])) DIV 16);
- IF k > 9 THEN d[i*2] := k + 55 ELSE d[i*2] := k + 48 END ;
- k := SHORT(ORD(SYSTEM.VAL(CHAR, b[i])) MOD 16);
- IF k > 9 THEN d[i*2+1] := k + 55 ELSE d[i*2+1] := k + 48 END ;
- INC(i)
- END
- END Unpack;
- PROCEDURE ConvertH* (y: REAL; VAR d: ARRAY OF CHAR);
- BEGIN Unpack(y, d)
- END ConvertH;
- PROCEDURE ConvertHL* (x: LONGREAL; VAR d: ARRAY OF CHAR);
- BEGIN Unpack(x, d)
- END ConvertHL;
- END Reals.
-